package com.bjsxt.service.impl;

import javax.annotation.Resource;
import java.util.List;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.date.DateUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.bjsxt.constants.Constants;
import com.bjsxt.domain.*;
import com.bjsxt.dto.PurchaseDto;
import com.bjsxt.dto.PurchaseFormDto;
import com.bjsxt.dto.PurchaseItemDto;
import com.bjsxt.mapper.InventoryLogMapper;
import com.bjsxt.mapper.MedicinesMapper;
import com.bjsxt.mapper.PurchaseItemMapper;
import com.bjsxt.mapper.PurchaseMapper;
import com.bjsxt.service.PurchaseService;
import com.bjsxt.utils.IdGeneratorSnowflake;
import com.bjsxt.vo.DataGridView;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.dubbo.config.annotation.Service;
import org.springframework.beans.factory.annotation.Autowired;

@Service
@Slf4j
public class PurchaseServiceImpl implements PurchaseService{

    @Autowired
    private PurchaseMapper purchaseMapper;

    @Autowired
    private PurchaseItemMapper purchaseItemMapper;

    @Autowired
    private InventoryLogMapper inventoryLogMapper;

    @Autowired
    private MedicinesMapper medicinesMapper;

    //分页查询
    @Override
    public DataGridView listPurchasePage(PurchaseDto purchaseDto) {
        Page<Purchase> page = new Page<>(purchaseDto.getPageNum(),purchaseDto.getPageSize());
        QueryWrapper<Purchase> qw = new QueryWrapper<>();
        // 根据供应商id查询
        qw.eq(StringUtils.isNotBlank(purchaseDto.getProviderId()),Purchase.COL_PROVIDER_ID,purchaseDto.getProviderId());
        // 根据申请人模糊查询
        qw.like(StringUtils.isNotBlank(purchaseDto.getApplyUserName()),Purchase.COL_APPLY_USER_NAME,purchaseDto.getApplyUserName());
        // 根据单据状态进行查询
        qw.eq(StringUtils.isNotBlank(purchaseDto.getStatus()),Purchase.COL_STATUS,purchaseDto.getStatus());
        // 根据创建时间进行降序
        qw.orderByDesc(Purchase.COL_CREATE_TIME);
        purchaseMapper.selectPage(page,qw);
        return new DataGridView(page.getTotal(),page.getRecords());
    }

    // 根据采购单号查询采购单据信息
    @Override
    public Purchase getPurchaseById(String purchaseId) {
        return purchaseMapper.selectById(purchaseId);
    }

    // 提交审核
    @Override
    public int doAudit(String purchaseId, SimpleUser simpleUser) {
        // 根据采购单id查询采购单据信息
        Purchase purchase = purchaseMapper.selectById(purchaseId);
        // 设置状态为待审核
        purchase.setStatus(Constants.STOCK_PURCHASE_STATUS_2);
        // 设置申请人名称
        purchase.setApplyUserName(simpleUser.getUserName());
        // 设置申请人id
        purchase.setApplyUserId(Long.valueOf(simpleUser.getUserId().toString()));
        return purchaseMapper.updateById(purchase);
    }

    // 作废
    @Override
    public int doInvalid(String purchaseId) {
        // 根据采购单id查询采购单据信息
        Purchase purchase = purchaseMapper.selectById(purchaseId);
        // 设置状态为作废
        purchase.setStatus(Constants.STOCK_PURCHASE_STATUS_5);
        return purchaseMapper.updateById(purchase);
    }

    // 通过
    @Override
    public int auditPass(String purchaseId) {
        // 根据采购单id查询采购单据信息
        Purchase purchase = purchaseMapper.selectById(purchaseId);
        // 设置状态为审核通过
        purchase.setStatus(Constants.STOCK_PURCHASE_STATUS_3);
        return purchaseMapper.updateById(purchase);
    }

    // 审核不通过
    @Override
    public int auditNoPass(String purchaseId,String auditMsg) {
        // 根据采购单id查询采购单据信息
        Purchase purchase = purchaseMapper.selectById(purchaseId);
        // 设置状态为审核不通过
        purchase.setStatus(Constants.STOCK_PURCHASE_STATUS_4);
        // 设置审核不通过原因
        purchase.setExamine(auditMsg);
        return purchaseMapper.updateById(purchase);
    }

    // 根据采购单号查询采购详情信息
    @Override
    public List<PurchaseItem> getPurchaseItemById(String purchaseId) {
        if (null!=purchaseId){
            QueryWrapper<PurchaseItem> qw = new QueryWrapper<>();
            qw.eq(PurchaseItem.COL_PURCHASE_ID,purchaseId);
            return purchaseItemMapper.selectList(qw);
        }
        return null;
    }

    /**
     * 暂存采购单主表数据和详情数据
     * 暂存和保存并提交的区别是 暂存需要修改状态为未提交 保存并提交需要修改采购单主表状态为待审核
     * @param purchaseFormDto
     * @return
     */
    @Override
    public int addPurchaseAndItem(PurchaseFormDto purchaseFormDto) {
        // 根据采购单主表id查询采购单主表信息
        Purchase purchase = purchaseMapper.selectById(purchaseFormDto.getPurchaseDto().getPurchaseId());

        // 如果之前有数据 就删除
        if (purchase!=null){
            // 删除之前的采购单主表数据
            purchaseMapper.deleteById(purchase.getPurchaseId());
            // 删除之前的采购详情表数据
            QueryWrapper<PurchaseItem> qw = new QueryWrapper<>();
            qw.eq(PurchaseItem.COL_PURCHASE_ID,purchase.getPurchaseId());
            purchaseItemMapper.delete(qw);
        }

        // 重新存入采购单主表数据 并设置状态为未提交
        Purchase newPurchase = new Purchase();
        // 复制属性
        BeanUtil.copyProperties(purchaseFormDto.getPurchaseDto(),newPurchase);
        // 设置状态
        newPurchase.setStatus(Constants.STOCK_PURCHASE_STATUS_1);
        // 设置创建人
        newPurchase.setCreateBy(purchaseFormDto.getSimpleUser().getUserName());
        // 设置创建时间
        newPurchase.setCreateTime(DateUtil.date());
        // 保存采购单主表数据
        int i = purchaseMapper.insert(newPurchase);
        if (i<=0){
            log.info("保存采购单主表信息失败");
        }

        // 保存采购单详情表数据
        for (PurchaseItemDto purchaseItemDto : purchaseFormDto.getPurchaseItemDtos()) {
            PurchaseItem purchaseItem = new PurchaseItem();
            // 复制属性
            BeanUtil.copyProperties(purchaseItemDto,purchaseItem);
            // 设置采购单主表id
            purchaseItem.setPurchaseId(newPurchase.getPurchaseId());
            // 设置采购详情表id
            purchaseItem.setItemId(IdGeneratorSnowflake.snowflakeId().toString());
            // 保存数据
            int i1 = purchaseItemMapper.insert(purchaseItem);
            if (i1<=0){
                log.info("保存采购单详情表信息失败");
            }
        }
        return i;
    }

    /**
     * 保存并提交审核采购单主表数据和详情数据
     * 暂存和保存并提交的区别是 暂存需要修改状态为未提交 保存并提交需要修改采购单主表状态为待审核
     * @param purchaseFormDto
     * @return
     */
    @Override
    public int addPurchaseAndItemToAudit(PurchaseFormDto purchaseFormDto) {
        // 根据采购单主表id查询采购单主表信息
        Purchase purchase = purchaseMapper.selectById(purchaseFormDto.getPurchaseDto().getPurchaseId());

        // 如果之前有数据 就删除
        if (purchase!=null){
            // 删除之前的采购单主表数据
            purchaseMapper.deleteById(purchase.getPurchaseId());
            // 删除之前的采购详情表数据
            QueryWrapper<PurchaseItem> qw = new QueryWrapper<>();
            qw.eq(PurchaseItem.COL_PURCHASE_ID,purchase.getPurchaseId());
            purchaseItemMapper.delete(qw);
        }

        // 重新存入采购单主表数据 并设置状态为待审核
        Purchase newPurchase = new Purchase();
        // 复制属性
        BeanUtil.copyProperties(purchaseFormDto.getPurchaseDto(),newPurchase);
        // 设置状态 为待审核
        newPurchase.setStatus(Constants.STOCK_PURCHASE_STATUS_2);
        // 设置创建人
        newPurchase.setCreateBy(purchaseFormDto.getSimpleUser().getUserName());
        // 设置创建时间
        newPurchase.setCreateTime(DateUtil.date());
        // 设置申请人
        newPurchase.setApplyUserName(purchaseFormDto.getSimpleUser().getUserName());
        // 设置申请人ID
        newPurchase.setApplyUserId(Long.valueOf(purchaseFormDto.getSimpleUser().getUserId().toString()));
        // 保存采购单主表数据
        int i = purchaseMapper.insert(newPurchase);
        if (i<=0){
            log.info("保存采购单主表信息失败");
        }

        // 保存采购单详情表数据
        for (PurchaseItemDto purchaseItemDto : purchaseFormDto.getPurchaseItemDtos()) {
            PurchaseItem purchaseItem = new PurchaseItem();
            // 复制属性
            BeanUtil.copyProperties(purchaseItemDto,purchaseItem);
            // 设置采购单主表id
            purchaseItem.setPurchaseId(newPurchase.getPurchaseId());
            // 设置采购详情表id
            purchaseItem.setItemId(IdGeneratorSnowflake.snowflakeId().toString());
            // 保存数据
            int i1 = purchaseItemMapper.insert(purchaseItem);
            if (i1<=0){
                log.info("保存采购单详情表信息失败");
            }
        }
        return i;
    }

    /**
     * 对采购信息进行入库
     *  TODO 入库需要以下几步操作：
     *      1.向stock_inventory_log入库日志表中添加数据
     *      2.更新stock_medicines药品库存表中的药品库存
     *      3.更新stock_purchase表中的状态为入库成功
     * @param purchaseId
     * @param currentSimpleUser
     * @return
     */
    @Override
    public int doInventory(String purchaseId, SimpleUser currentSimpleUser) {
        // 根据采购主表id查询主表数据
        Purchase purchase = purchaseMapper.selectById(purchaseId);
        // 若采购单信息不为空并且状态为审核成功则可以进行接下来的操作
        if (purchase!=null&&purchase.getStatus().equals(Constants.STOCK_PURCHASE_STATUS_3)){
            // 根据采购单主表id查询采购详情表的数据
            QueryWrapper<PurchaseItem> qw = new QueryWrapper<>();
            qw.eq(PurchaseItem.COL_PURCHASE_ID,purchaseId);
            List<PurchaseItem> purchaseItems = purchaseItemMapper.selectList(qw);
            // 遍历
            for (PurchaseItem purchaseItem : purchaseItems) {
                // 1.向stock_inventory_log入库日志表中添加数据
                InventoryLog inventoryLog = new InventoryLog();
                inventoryLog.setInventoryLogId(purchaseItem.getItemId());
                inventoryLog.setPurchaseId(purchaseItem.getPurchaseId());
                inventoryLog.setMedicinesId(purchaseItem.getMedicinesId());
                inventoryLog.setInventoryLogNum(purchaseItem.getPurchaseNumber());
                inventoryLog.setTradePrice(purchaseItem.getTradePrice());
                inventoryLog.setTradeTotalAmount(purchaseItem.getTradeTotalAmount());
                inventoryLog.setBatchNumber(purchaseItem.getBatchNumber());
                inventoryLog.setMedicinesName(purchaseItem.getMedicinesName());
                inventoryLog.setMedicinesType(purchaseItem.getMedicinesType());
                inventoryLog.setPrescriptionType(purchaseItem.getPrescriptionType());
                inventoryLog.setProducterId(purchaseItem.getProducterId());
                inventoryLog.setConversion(purchaseItem.getConversion());
                inventoryLog.setUnit(purchaseItem.getUnit());
                inventoryLog.setCreateTime(DateUtil.date());
                inventoryLog.setCreateBy(currentSimpleUser.getUserName());

                //保存数据
                inventoryLogMapper.insert(inventoryLog);

                // 2.更新stock_medicines药品库存表中的药品库存
                Medicines medicines=this.medicinesMapper.selectById(purchaseItem.getMedicinesId());
                medicines.setMedicinesStockNum(medicines.getMedicinesStockNum()+purchaseItem.getPurchaseNumber());
                medicines.setUpdateBy(currentSimpleUser.getUserName());
                this.medicinesMapper.updateById(medicines);
            }
            // 3.更新stock_purchase表中的状态为入库成功
            purchase.setStatus(Constants.STOCK_PURCHASE_STATUS_6);//入库成功
            purchase.setStorageOptTime(DateUtil.date());
            purchase.setStorageOptUser(currentSimpleUser.getUserName());
            return this.purchaseMapper.updateById(purchase);
        }
        return -1;
    }
}
